Ext.define('AgenteNET.controller.Conexao', {
	extend : 'Ext.app.Controller',

	stores : [ 'Conexao' ],
	views :['MainLayer','MenuGlobal','Usuario'],
	monitorTempo : 50,
	conexaoTempo : 15,

	init : function() {
		this.control({
			'login' : {
				show : function(win) {
					var form = win.down('form');
					form.down('textfield[name="password"]').setValue();
					form.down('textfield[name="login"]').focus(true, 1500);
				}
			},
			'button' : {
				click : this.executarAcao
			},
			'menuitem' : {
				click : this.executarAcao
			},

		});
		this.monitorarConexao();
		this.inicializado = true;
	},
	historico:[],
	executarAcao:function(el){
		var app = this.application, controller = this;
		if (el.executar != undefined){
			acao=this.conexao.recursos().getById(el.executar);
			if(acao.get('controle')!='')
				controller = app.getController(acao.get('controle'));
			if (!controller.inicializado){
				controller.init();
				controller.inicializado = true;
			}
			if (acao.get('funcao') != ''){
				if (controller[acao.get('funcao')] != undefined) {
				    Ext.Function.bind(controller[acao.get('funcao')], controller,arguments)();
				}else{
					console.log('Funcao "'+acao.get('funcao')+'" nao encontrada no controle "'+acao.get('controle')+'"');
				}
			}
			this.historico[this.historico.length]=el.executar;
			this.carregarUtilidadesControle(acao);
		}else if(el.acao != undefined || el.controle != undefined){
			if (el.controle != undefined)
				controller = app.getController(el.controle);
			if (!controller.inicializado)
				controller.init();
			if (el.acao != undefined)
				if (controller[el.acao] != undefined) {
					Ext.Function.bind(controller[el.acao], controller,
							arguments)();
				}
		}
	},
	Voltar:function(el){
		var acaoAnterior=this.historico[this.historico.length-2];
	    delete this.historico[this.historico.length-1];
	    if(el)if(el.up)if(el.up('window'))el.up('window').close();
	    return this.executarAcao({executar:acaoAnterior});
	},
	
	acaoAtual:null,
	carregarUtilidadesControle:function(acao){
		
		var menu=[],recursos=null,layerControl=null,menuControle=null,menuLayer=null;
		if (recursos = this.conexao.recursos()) {
			for (i in recursos.data.items) {
				if(recursos.data.items[i].get('primario')==acao.get('id')){
					menu[menu.length]={
						recurso : recursos.data.items[i],
						app : this.application,
						text : recursos.data.items[i].get('titulo'),
						executar:recursos.data.items[i].get('id'),
					};
				}
			}
		}

		menuControle = Ext.getCmp('menuControle');
		if(menu.length>0){
			menuLayer=Ext.getCmp('menuControlerLayer');
			menuLayer.removeAll(true);
			menuLayer.add(menu);
			menuControle.show();
		}else{
			menuControle.hide();
		}
			
		if(this.acaoAtual!=acao.get('id')){
			this.acaoAtual=acao.get('id');
			infoControle = Ext.getCmp('infoControle');
			if(acao.get('descricao')!=''){
				infoControle.removeAll(true);
				infoControle.add({frame:false,border:false,items:{frame:false,border:false,padding : '10 10 10 10',html:acao.get('descricao')}});
				infoControle.show();
			}else{
				infoControle.hide();
			}
			videoControle = Ext.getCmp('videoControle');
			if(menu.length>0){
				videoControle.removeAll(true);
				videoControle.add({frame:false,border:false,items:{
					html:  '<iframe width="255" height="180" src="http://www.youtube.com/embed/wZY1pbsyCQs?version=2&fs=1&autoplay=1" frameborder="0" allowfullscreen></iframe>',
					width:270,
					height:200,
					margin : '0 0 0 0',
					padding : '10 10 10 10',
					//	x:5,y:5
				}});
				videoControle.show();
			}else{
				videoControle.hide();
			}
		}
		
	},

	login : null,
	conexao:null,
	monitorarConexao : function() {
		var token = Ext.util.Cookies.get('token');
		if (token) {
			this.getConexaoStore().model.load(token, {
				scope : this,
				success : function(model, op) {
					this.atualizarMainLayer(model);
					if (this.login) {
						this.login.destroy();
						this.login = null;
					}
					this.conexao=model;
					Ext.defer(this.monitorarConexao, this.monitorTempo * 1000,
							this);
				},
				failure : function(model, op) {
					if (op.error) {
						if (op.error.status == 0) {
							alert('Não foi possivel acessar o servidor '
									+ 'para solicitar a autenticação');
						} else if (op.error.status == 404) {
							alert('Foi possível solicitar '
									+ 'a autenticação do usuário');
						} else if (op.error.status == 403) {
							alert(op.error.msg);
							if (!this.login)
								this.login = Ext.create('AgenteNET.view.Login');
						} else {
							alert(op.error);
						}
					}
					this.conexao=null;
					this.atualizarMainLayer();
				}
			});
		} else {
			this.conexao=null;
			if (!this.login)
				this.login = Ext.create('AgenteNET.view.Login');
			this.atualizarMainLayer();
		}
	},
	Login:function(){
		if (!this.login)
			this.login = Ext.create('AgenteNET.view.Login');
		return this.login;
	},

	solicitarAutenticacao : function(el) {
		var win = el.up('window');
		var form = win.down('form').getForm();
		if (!form.isValid()) {
			return false;
		}
		var data = form.getValues();
		var model = this.getConexaoStore().model;
		var log = model.create(data);
		log.save({
			scope : this,
			win : win,
			success : function(model, op) {
				this.conectar(model);
				op.win.close();
			},
			failure : function(model, op) {
				if (op.error) {
					if (op.error.status == 0) {
						alert('Não foi possivel acessar o servidor '
								+ 'para solicitar a autenticação');
					} else if (op.error.status == 404) {
						alert('Foi possível solicitar '
								+ 'a autenticação do usuário');
					} else if (op.error.status == 403) {
						alert(op.error.msg);
					} else {
						alert(op.error);
					}
				}
				op.win.fireEvent('show', op.win);
			}
		});
		return model;
	},

	conectar : function(model) {
		var expiry = new Date();
		expiry.setTime(expiry.getTime() + (this.tempoConexao * 1000));
		Ext.util.Cookies.set('token', model.get('token'), expiry);
		this.monitorarConexao();
		return this.conexao;
	},
	desconectar : function() {
		Ext.util.Cookies.clear('token');
		this.monitorarConexao();
		return this.conexao;
	},

	mainLayer : null,
	userview : null,
	atualizarMainLayer : function(conexao) {
		this.conexao=conexao;
		var main = null, menu = null, layerUser = null;
		if (!this.mainLayer) {
			this.mainLayer = Ext.create('AgenteNET.view.MainLayer');
		}
		main = this.mainLayer;
		menu = main.down('menuGlobal');
		menu.removeAll(true);
		layerUser = Ext.getCmp('UserLayer');
		if (conexao) {
			if (recursos = conexao.recursos()) {
				for (i in recursos.data.items) {
					if(recursos.data.items[i].get('primario')==1){
						menu.add({
							recurso : recursos.data.items[i],
							app : this.application,
							text : recursos.data.items[i].get('titulo'),
							executar:recursos.data.items[i].get('id'),
						});
					}
				}
			}
			menu.add([ '->', {
				text : 'Sair',
				acao : 'desconectar'
			} ]);
			var acao=conexao.recursos().getById(this.historico[this.historico.length-1]);
			if(acao)
				this.carregarUtilidadesControle(acao);
			if (!this.userview) {
				layerUser.removeAll(true);
				this.userview = layerUser.add(Ext
						.create('AgenteNET.view.Usuario'));
				this.userview.down('image').setSrc(
						'tema/default/images/fotoUsuario.jpg');
				this.userview.down('text[id="usuarioNome"]').setText(
						conexao.get('usuario'));
				this.userview.down('text[id="usuarioIp"]').setText(
						conexao.get('ip'));
				+conexao.get('ip');
			}

			if(this.InicializarControle==undefined){
				this.InicializarControle=true;
				if (InicializarControle != undefined) {
					controller = this.application.getController(InicializarControle);
					if (!controller.inicializado)
						controller.init();
					if (ExecutarAcao != undefined)
						if (controller[ExecutarAcao] != undefined) {
							Ext.Function.bind(controller[ExecutarAcao], controller,
									arguments)();
						}
				}
			}
		
		} else {
			if (this.userview)
				this.userview.destroy();
			this.userview = null;
			layerUser.removeAll(true);
		}
	},

});
